﻿#include <iostream>
class MoveObject {
public:
    int x;
    //virtual int x;//报错，不能定义变量
    int y;
    virtual MoveObject* Move() {//virtual告诉派生类该函数是虚的，可以被派生类重写覆盖
        x++;
        y++;
        return this;
    }
};
//void virtual MoveObject::Move() {}//报错，不能定义在外部
class NPCObject :public MoveObject {
private:
    MoveObject* Move() {
        x++;
        y++;
        std::cout << "我是NPC" << std::endl;
        return this;
    }
};
class MonsterObject :public NPCObject {
public:
    MonsterObject* Move()final {
        x++;
        y++;
        std::cout << "我是怪物" << std::endl;
        return this;
    }
};
//MoveObject和NPCObject是父子关系，所以NPCObject的Move函数能返回MoveObject类的指针，而MonsterObject和NPCObject是兄弟关系，所以NPCObject的Move函数不能返回MonsterObject类的指针
void Move(MoveObject* obj) {//要实现动态多态，必须使用基类指针，引用也可以
    obj->Move();
}
int main()
{
    MonsterObject snake;
    NPCObject zsf;

    Move(&snake);//我是怪物
    Move(&zsf);//我是NPC
    MoveObject* obj = &snake;
    obj->Move();//基类指针obj根据指向的类进行判断函数执行，如指向类MonsterObject就执行类MonsterObject的Move函数，就算有多个派生类都是一样的结果

}
